/**
 * 文件名称:  ParamDefServiceImpl.java
 * 文件序号:  序号
 * 内容描述:  文件简单描述，多行换行书写
 * 版权声明:  山东鸿蝶信息技术有限公司
 * 创建用户:  zhangkai
 * 创建日期:  2017/1/18 16:24
 * 修改用户:  无
 * 修改日期:  无
 * 修改说明:  无
 * 文件版本:  V1.0
 * 文件路径:
 */

package com.hongdee.base.param.service.impl;


import com.hongdee.base.param.dao.IParamDefDao;
import com.hongdee.base.param.entity.ParamDef;
import com.hongdee.base.param.service.IParamDefService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.hongdee.base.Constant.P_ROOT_ID;

/**
 * 名  称:ParamDefServiceImpl
 * 类  型: class
 * 描  述: 用一句话描述类的作用
 * 路  径:com.hongdee.base.param.service.impl
 * 作  者:zhuhongchao
 * 日  期:2017/1/18 16:24
 */


@Service
public class ParamDefServiceImpl implements IParamDefService {

    private String tabName = "T_BC_PARAM_DEF";

    @Autowired
    private IParamDefDao paramDefDao;


    /**
     * 方法名称: page
     * 方法描述: 分页查询品牌变更历史
     * 参数名称: String start 起始行数
     * 参数名称: String limit 分页大小
     * 参数名称: String sys_code 系统编码
     * 参数名称: String def_type 参数类型
     * 参数名称：String def_name 参数名称
     * 返回内容: Map
     * 异常说明: Exception
     * 创建用户:术洪超
     * 创建时间:
     * 修改用户:术洪超
     * 修改时间:2017/2/8
     * 修改内容:注释内容
     */
    @Override
    public Map page(String start, String limit, String pCode, String value) throws Exception {
        String sql = "select * from " + tabName + " where p_code = ?  ";
        List<Object> params = new ArrayList();
        params.add(pCode);
        if (!StringUtils.isEmpty(value)) {
            sql += " and ( code  like  ? or name like ? ) ";
            params.add("%" + value + "%");
            params.add("%" + value + "%");
        }
        return paramDefDao.page(sql, params.toArray(), start, limit);
    }

    /**
     * 方法名称: info
     * 方法描述: 详情查询
     * 参数名称: String id 主键id
     * 返回内容: 实体对象
     * 异常说明: Exception
     * 创建用户:术洪超
     * 创建时间:
     * 修改用户:术洪超
     * 修改时间:2017/2/8
     * 修改内容:注释内容
     */
    @Override
    public Map info(String id) throws Exception {
        if (org.springframework.util.StringUtils.isEmpty(id)) {
            throw new Exception("请选择类型");
        }
        return this.paramDefDao.info(tabName, "id", id);
    }


    /**
     * 方法名称: saveOrUpdate
     * 方法描述:  保存或更新实体，通过主键判断
     * 参数名称: ParamDef data 要保存的变更历史记录实体
     * 返回内容: ParamDef 保存后的历史记录实体
     * 异常说明: Exception
     * 创建用户:术洪超
     * 创建时间:
     * 修改用户:术洪超
     * 修改时间:2017/2/8
     * 修改内容:注释内容
     */
    @Override
    public ParamDef saveOrUpdate(ParamDef paramDef) throws Exception {


        if (exist(paramDef.getCode(), paramDef.getId())) {
            throw new Exception("该分类下已存在相同编码！");
        }

        this.paramDefDao.saveOrUpdate(paramDef);
        return paramDef;
    }


    /**
     * 方法名称: update
     * 方法描述: 修改品牌状态
     * 参数名称: String id  主键id
     * 参数名称: String status 状态
     * 返回内容:
     * 异常说明:Exception
     * 创建用户:术洪超
     * 创建时间:
     * 修改用户:术洪超
     * 修改时间:2017/2/8
     * 修改内容:注释内容
     */
    @Override
    public void update(String id, String status) throws Exception {
        if (StringUtils.isEmpty(id)) {
            throw new Exception("请选择参数");
        }
        String hql = "update ParamDef set status = :status where id = :id ";
        Map params = new HashMap();
        params.put("id", id);
        params.put("status", status);
        this.paramDefDao.update(hql, params);
    }

    /**
     * 查询参数树
     *
     * @param pCode 上级节点编码
     * @return
     */
    @Override
    public List tree(String pCode) throws Exception {
        return buildParamChild(pCode, false);
    }

    /***
     * 查询任务定认参数值
     * @param pCode 默认为任务类型
     * @return
     */
    @Override
    public List treeParam(String pCode) throws Exception {
        return buildParamChild(pCode, true);
    }

    private List buildParamChild(String key, boolean hasParam) throws Exception {
        //从缓存中取得用户已有的角色

        String sqlStr = " select * from t_bc_param_def where p_code = ? ";
        if (!hasParam) {
            sqlStr += " and type != '1' ";
        }
        List<Map<String, Object>> treeP = this.paramDefDao.list(sqlStr, key);
        return buildParamParent(treeP, hasParam);
    }

    private List buildParamParent(List<Map<String, Object>> paramList, boolean hasParam) throws Exception {
        if (paramList.size() == 0) {
            return paramList;
        }
        List<Map<String, Object>> childList;
        for (Map map : paramList) {
            String resId = String.valueOf(map.get("code"));
            childList = buildParamChild(resId, hasParam);
            //存在子节点，增加子节点 返回
            map.put("child", childList);
        }
        return paramList;
    }

    /**
     * @param code 当前编码
     * @param id   主键
     * @return
     */
    private Boolean exist(String code, String id) throws Exception {
        String sql = "select 1 from " + tabName + " where code = ?  ";
        List params = new ArrayList();
        params.add(code);

        if (null != id) {
            //更新时，增加主键判断
            sql += " and id != ? ";
            params.add(id);
        }
        List ls = this.paramDefDao.list(sql, params.toArray());
        return null != ls && ls.size() > 0;
    }
}

